1 module hip.bind.interpreters; 2 3 version(Have_bindbc_lua) 4 version = HipremeEngineLua; 5 6 7 struct HipInterpreterEntry 8 { 9 HipInterpreter intepreter = HipInterpreter.none; 10 string sourceEntry; 11 } 12 13 struct InterpreterResult(T) 14 { 15 bool valid; 16 T value; 17 alias value this; 18 } 19 20 struct InterpreterVoid 21 { 22 bool valid; 23 alias valid this; 24 } 25 26 enum HipInterpreter 27 { 28 none, 29 lua 30 } 31 32 alias InterpreterCFunction = extern(C) nothrow void function(); 33 interface IHipInterpreter 34 { 35 bool loadFile(string fileName); 36 void reload(); 37 bool hasFunction(string funcName); 38 void expose(string funcName, InterpreterCFunction func); 39 } 40 41 42 version(HipremeEngineLua) 43 { 44 package __gshared LuaInterpreter _lua; 45 public import hip.bind.interpreters.lua; 46 } 47 48 void startInterpreter(HipInterpreter interpreter) 49 { 50 final switch(interpreter) 51 { 52 case HipInterpreter.lua: 53 version(HipremeEngineLua) 54 _lua = new LuaInterpreter(); 55 break; 56 case HipInterpreter.none: 57 break; 58 } 59 } 60 61 void loadInterpreterEntry(HipInterpreter interpreter, string entryPoint) 62 { 63 final switch(interpreter) 64 { 65 case HipInterpreter.lua: 66 version(HipremeEngineLua) 67 { 68 assert(_lua.loadFile(entryPoint) && 69 _lua.hasFunction("HipInitialize") && 70 _lua.hasFunction("HipUpdate") && 71 _lua.hasFunction("HipRender"), 72 "Lua entrypoint "~entryPoint~" must implement the functions HipInitialize, HipUpdate and HipRender"); 73 74 _lua.call!LuaVoid("HipInitialize");//, "Invalid HipInitialize"; 75 } 76 break; 77 case HipInterpreter.none:break; 78 79 } 80 81 } 82 void sendInterpreterFunc(alias func)(HipInterpreter interpreter) 83 { 84 final switch(interpreter) 85 { 86 case HipInterpreter.lua: 87 version(HipremeEngineLua) 88 { 89 _lua.expose(__traits(identifier, func), &externLua!func); 90 } 91 break; 92 case HipInterpreter.none: 93 break; 94 } 95 } 96 97 98 void reloadInterpreter() 99 { 100 version(HipremeEngineLua) 101 { 102 if(_lua !is null) 103 _lua.reload(); 104 } 105 } 106 107 void renderInterpreter() 108 { 109 version(HipremeEngineLua) 110 { 111 if(_lua !is null) 112 _lua.call!(LuaVoid)("HipRender"); 113 } 114 } 115 116 void updateInterpreter() 117 { 118 version(HipremeEngineLua) 119 { 120 if(_lua !is null) 121 _lua.call!(LuaVoid)("HipUpdate"); 122 } 123 }